采集系统通信协议
备注:需要前提知识:👋计算机中进制的转换,👋进制运算,👋大端序与小端序
一 协议基本知识
1.1 376.1 协议
- 主站与采集终端通信协议,规定了电力用户用电信息采集系统主站和采集终端之间进行数据传输的帧格式,数据编码及传输规则。
- 适用于点对点,多点共线及一点对多点的通信方式,适用于主站对终端执行主从问答方式以及终端主动上传方式的通信。
1.2 专业术语
- terminal address:系统中终端设备的地址编码,简称终端地址(唯一地址)。
- system broadcast address:系统中所有终端都应该响应的地址编码(广播地址)。
- terminal group address:具有某一相同属性的终端群组编码,如属于同一行业、同一变电站、同一线路,响应同一个命令。
- master station address:主站中具有通信需求的对象(如工作站、应用功能模块等)的编码(终端与主站通信的地址)。
- indicated energy value:电能表计度器电能示值的简称。
- measured point:指可以测量出唯一的一组电气量值的测量装置与终端的顺序电气连接点,当物理上相同的一个电气连接点被多个装置所测量,或者被一个装置所测量但通过多种方式被传递到终端时,按照多个测量点计,每个测量点具有唯一的逻辑定位编码,是该装置在终端的参数配置、数据应用的唯一对象标识。(可以理解为集中器下的电表)。
- group total:指相关的各测量点的某一同类电气量值按设置的加或减运算关系计算得到的数值。
- Data unit identify:用于表示一个或一组信息点的一种或一组信息类型的标识。
- information point:表示参数或数据的对象信息,如测量点、总加组、控制轮次、直流模拟量分路等。
- information type:表示参数或数据的分类信息,一个信息类可以是一种参数或数据,也可以是一组参数或数据的集合。
- task:规定终端在指定时间或条件下执行所需的操作序列。
- communication flow:指由终端以本数据传输协议完整报文帧为基础统计的,与主站间的接收与发送报文帧的累计字节数。
1.3 符号和缩略语
符号和缩略语 | 表示 |
---|---|
BIN | 二进制编码 |
BS | 独立位组合 |
C | 控制域 |
CON | 请求确认标志位 |
CS | 帧校验和 |
DIR | 传输方向位 |
EC,EC1,EC2 | 事件计数器 |
ERC | 事件记录代码 |
FCB | 帧计数位 |
FCV | 帧计数有效位 |
FIR | 首帧标志:报文的第一帧 |
FIN | 末帧标志:报文的最后一帧 |
Fn | 信息类标识码 |
G | 电能量单位位 |
G1、G2、G3 | 组成倍率的码位 |
L | 长度 |
L1 | 用户数据长度 |
Lcn | 中文信息长度 |
Le | 事件记录长度 |
MSA | 主站地址 |
P | 校验位 |
pn | 信息点标识码 |
PFC | 启动帧计数器 |
PRM | 启动标志位 |
PSEQ | 启动帧序号 |
PW | 消息认证码字段 |
RSEQ | 响应帧序号 |
S | 正负极性位 |
S0 | 上下浮动位 |
SEQ | 帧序列域 |
Tp | 时间标签 |
TpV | 时间标签有效位 |
Td_c | 曲线类数据时标 |
Td_d | 日冻结类数据时标 |
Td_h | 小时冻结类数据时标 |
Td_m | 月冻结类数据时标 |
1.4 数据结构
帧的基本单元为8位字节。链路层传输顺序为低位在前,高位在后;低字节在前,高字节在后。 案例:68 32 00 32 00 68 E9 00 30 0F 27 00 00 72 00 00 04 00 C8 16 传输规则:
- 线路空闲状态为二进制1。
- 帧的字符之间无线路空闲间隔;两帧之间的线路空闲间隔最少需33位。
- 如按e)检出了差错,两帧之间的线路空闲间隔最少需33位。
- 帧校验和(CS)是用户数据区的八位位组的算术和,不考虑进位位。(重要判断帧是否有效)
接收方校验:
- 对于每个字符:校验起动位、停止位、偶校验位。 对于每帧:
- 检验帧的固定报文头中的开头和结束所规定的字符以及协议.标识位;
- 识别2个长度L;
- 每帧接收的字符数为用户数据长度L1+8;
- 帧校验和 (用户数据区的8位运算和)
- 结束字符(16)
二 解析基本帧结构
案例:68 32 00 32 00 68 E9 00 30 0F 27 00 00 72 00 00 04 00 C8 16
2.1 长度(L 2字节)
2.1.1 协议标识
- D0~D1:协议标识
Java:代码中判断 案例:68 32 00 32 00 68 E9 00 30 0F 27 00 00 72 00 00 04 00 C8 16 (16进制)
frame[1] & 0x03 = 数据帧的第二个字节& 0000 0011
1:2005
2:376.1
3:保留
4:禁止
32 & 0x03 = 0011 0010 & 0000 0011 = 2
2.1.2 用户数据长度
- 用户数据长度L1:由D2~D15组成,采用BIN编码,是控制域、地址域、链路用户数据(应用层)的字节总数(注意)
- 采用专用无线数传信道,长度L1不大于255。
- 采用网络传输,长度L1不大于16383。
案例:68 BE 01 BE 01 68 A8 00 30 0F 27 00 0C E1 02 01 01 04 19 09 17 06 11 04 00 00 00 80 00 00 00 00 20 00 00 00 00 20 00 00 00 00 20 00 00 00 00 20 00 00 00 40 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 20 00 00 00 05 00 00 00 05 00 00 00 05 00 00 00 05 00 00 00 20 00 00 00 05 00 00 00 05 00 00 00 05 00 00 00 05 00 01 00 00 03 51 16 19 09 CC 16 Java:
frame[2]<<8 | frame[1])>>2
0000 0001 <<8 | 1011 1110>>2
0000 0001 0000 0000 | 0000 0000 0010 1111
12F
return (frame[2]<<8 | frame[1])>>2)
2.2 控制域(C)
控制域C表示报文传输方向和所提供的传输服务类型的信息
2.2.1 DIR
DIR=0,表示此帧报文是由主站发出的下行报文,DIR=1,表示此帧报文是由终端发出的上行报文。
frame[6] & 0x80 = & 1000 0000
2.2.2 PRM
PRM=1,表示此帧报文来自启动站;PRM=0,表示此帧报文来自从动站。
frame[6] & 0x40 =& 0100 0000
2.2.3 FCB(下行)
- 当帧计数有效位FCV=1时,FCB表示每个站连续的发送/确认或者请求/响应服务的变化位。FCB位用来防止信息传输的丢失和重复。
- 启动站向同一从动站传输新的发送/确认或请求/响应传输服务时,将FCB取相反值。启动站保存每一个从动站FCB值,若超时未收到从动站的报文,或接收出现差错,则启动站不改变FCB的状态,重复原来的发送/确认或者请求/响应服务。
- 复位命令中的FCB=0,从动站接收复位命令后将FCB置“0”。
frame[6] & 0x20 & 0010 0000
2.2.4 ACD(上行)
ACD位用于上行响应报文中。ACD=1表示终端有重要事件等待访问,则附加信息域中带有事件计数器ECACD=0表示终端无事件数据等待访问。(当ACD为11时,我们可以去记录终端的事件) ACD置“1”和置“0”规则: a) 自上次收到报文后发生新的重要事件,ACD位置“1”; b) 收到主站请求事件报文并执行后,ACD位置“0”。
frame[6] & 0x20 & 0010 0000
2.2.5 FCV (下行)
FCV=1,表示FCB位有效;FCV=0,表示FCB位无效。
frame[6] & 0x10 & 0001 0000
2.2.6 功能码
功能码定义(PRM=1)
功能码 | 帧类型 | 服务功能 |
---|---|---|
0 | —— | 备用 |
1 | 发送∕确认 | 复位命令 |
2~3 | —— | 备用 |
4 | 发送∕无回答 | 用户数据 |
5~8 | —— | 备用 |
9 | 请求∕响应帧 | 链路测试 |
10 | 请求∕响应帧 | 请求1级数据 |
11 | 请求∕响应帧 | 请求2级数据 |
12~15 | —— | 备用 |
a) 启动站功能码10(请求1级数据)用于应用层请求确认(CON=1)的链路传输,应用层请求确认标志见本部分4.3.4.3.4。 b) 启动站功能码11(请求2级数据)用于应用层请求数据的链路传输。 功能码定义(PRM=0)
功能码 | 帧类型 | 服务功能 |
---|---|---|
0 | 确认 | 认可 |
1~7 | —— | 备用 |
8 | 响应帧 | 用户数据 |
9 | 响应帧 | 否认:无所召唤的数据 |
10 | —— | 备用 |
11 | 响应帧 | 链路状态 |
12~15 | —— | 备用 |
frame[6] & 0x0F & 0000 1111
案例:68 32 00 32 00 68 E9 00 30 0F 27 00 00 72 00 00 04 00 C8 16
E9 1110 1001
DIR: 1
PRM: 1
ACD: 1
功能码:9 链路测试
2.3 地址域(A)
GB 2260—2007:https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=C9C488FD717AFDCD52157F41C3302C6D 地址域由行政区划码A1、终端地址A2、主站地址和组地址标志A3组成
地址域 | 数据格式 | 字节数 |
---|---|---|
行政区划码A1 | BCD | 2 |
终端地址A2 | BIN | 2 |
主站地址和组地址标志A3 | BIN | 1 |
前提知识:
- 小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处。
- 大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。
- 高低字节:一般PC是低字节序,如果按平时书写习惯,从左到右是高位到地位的顺序,则例如0X12345678,在内存中的情况是
- 高地址👉 12 34 56 78 👈低字节
2.3.1 BCD码(A1)
一种编码方式,用二进制表示十进制。由于4位二进制共有16种可能,而只需表示0-9的十个数,故有一定的操作空间。(简单来说就是4位二进制,来表示十进制)。 我的理解如下:68 32 00 32 00 68 C9 03 44 04 00 00 02 71 00 00 01 00 88 16 第一部分为行政区划码A1,行政区划码按GB 2260—91的规定执行,数据格式为两字节BCD码03 44,字节顺序为低位在前高位在后,实际数值应为4403
0011 0000 0000 0000
3 0 0 0
个位 十位 百位 千位
(frame[7] & 0x0F) + (frame[7] >> 4) * 10 +(frame[8] & 0x0F )*100 + (frame[8] >> 4) * 1000
2.3.2 终端地址 (A2)
- 终端地址A2选址范围为1~65535。A2=0000H为无效地址,A2=FFFFH且A3的D0位为“1”时表示系统广播地址
- 第二部分为终端地址A2,终端地址A2选址范围为1~65535。A2=0000H为无效地址,A2=FFFFH且A3的D0位为“1”时表示系统广播地址,数据格式为两字节BIN码04 00,字节顺序为低位在前高位在后,实际数值应为0004
(frame[10]<<8) + frame[9]
我们来看:68 3a 00 3a 00 68 4b 00 30 0f 27 00 0e 71 00 00 02 00 00 17 49 16 这个终端地址(HEX):3000270F
2.3.3 主站地址和组地址标志(A3)
- A3的D0位为终端组地址标志,D0=0表示终端地址A2为单地址;D0=1表示终端地址A2为组地址;A3的D1~D7组成0~127个主站地址MSA。
- 主站启动的发送帧的MSA应为非零值,其终端响应帧的MSA应与主站发送帧的MSA相同。终端启动发送帧的MSA应为零,其主站响应帧的MSA也应为零。
- 数据格式为1字节BIN码00,A3的d0位为终端组地址标志,d0=0表示终端地址A2为单地址,d7~d1为主站地址MSA,另外该帧是由终端发起的上行报文。
- 终端启动发送帧的MSA应为0,其主站的响应帧也应为0,这是硬性规定,如果不是0,则一定是错误的。
frame[11]>>1
2.4 帧校验和(CS)
帧校验和是用户数据区所有字节的八位位组算术和,不考虑溢出位。用户数据区包括控制域、地址域、链路用户数据(应用层)三部分。 案例:68 3a 00 3a 00 68 4b 00 30 0f 27 00 0e 71 00 00 02 00 00 17 49 16 帧校验和:49
count: 为控制域、地址域、链路用户数据(应用层)字节总数
count&0xFF;
2.5 应用层
注意:对于应用层需要加密的关键数据,加密的数据区包括:应用层功能码、帧序列域、数据单元标识及数据单元部分
2.5.1 应用层功能码(AFN)
应用层功能码AFN由一字节组成,采用二进制编码表示
应用功能码AFN | 应用功能定义 |
---|---|
00H | 确认∕否认 |
01H | 复位 |
02H | 链路接口检测 |
03H | 中继站命令 |
04H | 设置参数 |
05H | 控制命令 |
06H | 身份认证及密钥协商 |
07H | 备用 |
08H | 请求被级联终端主动上报 |
09H | 请求终端配置 |
0AH | 查询参数 |
0BH | 请求任务数据 |
0CH | 请求1类数据(实时数据) |
0DH | 请求2类数据(历史数据) |
0EH | 请求3类数据(事件数据) |
0FH | 文件传输 |
10H | 数据转发 |
11H~FFH | 备用 |
案例:68 3a 00 3a 00 68 4b 00 30 0f 27 00 0e 71 00 00 02 00 00 17 49 16 0E:表示请求3类数据(事件数据)
2.5.2 帧序列域(SEQ)
帧序列域SEQ为1字节,用于描述帧之间的传输序列的变化规则,由于受报文长度限制,数据无法在一帧内传输,需要分成多帧传输(每帧都应有数据单元标识,都可以作为独立的报文处理)。
D7 | D6 | D5 | D4 | D3~D0 |
---|---|---|---|---|
TpV | FIR | FIN | CON | PSEQ∕RSEQ |
2.5.2.1 Tpv
- TpV=0,表示在附加信息域中无时间标签Tp
- TpV=1,表示在附加信息域中带有时间标签Tp
_seq & 0x80)
2.5.2.2 FIR、FIN
- FIR:置“1”,报文的第一帧。
- FIN:置“1”,报文的最后一帧。
- FIR、FIN组合状态所表示的 | FIR | FIN | 应用说明 | | --- | --- | --- | | 0 | 0 | 多帧:中间帧 | | 0 | 1 | 多帧:结束帧 | | 1 | 0 | 多帧:第1帧,有后续帧。 | | 1 | 1 | 单帧 |
_seq & 0x40
_seq & 0x20
2.5.2.3 CON
- 在所收到的报文中,CON位置“1”,表示需要对该帧报文进行确认;置“0”,表示不需要对该帧报文进行确认
_seq & 0x10
2.5.2.4 PSEQ/RSEQ
启动帧
- PSEQ取自1字节的启动帧计数器PFC的低4位计数值0~15
- 每一对启动站和从动站之间均有1个独立的、由1字节构成的计数范围为0~255的启动帧帧序号计数器PFC,用于记录当前启动帧的序号。启动站每发送1帧报文,该计数器加1,从0~255循环加1递增;重发帧则不加1。(就是计数器)
响应帧
- 响应帧序号RSEQ以启动报文中的PSEQ作为第一个响应帧序号,后续响应帧序号在RSEQ的基础上循环加1递增,数值范围为0~15。
帧序列改变规则
- 启动站发送报文后,当一个期待的响应在超时规定的时间内没有被收到,如果允许启动站重发,则该重发的启动帧序号PSEQ不变。重发次数可设置,最多3次;重发次数为0,则不允许重发。
- 当TpV=0时,如果从动站连续收到两个具有相同启动帧序号PSEQ的启动报文,通常意味着报文的响应未被对方站收到。在这种情况下,则重发响应(不必重新处理该报文)。
- 当TpV=0时,如果启动站连续收到两个具有相同响应帧序号RSEQ的响应帧,则不处理第二个响应。
- 终端能同时处理多个请求。
传输类别
类别 | 功能 | 用途 |
---|---|---|
S1 | 发送∕无回答 | 启动站发送传输,从动站不回答。 |
S2 | 发送∕确认 | 启动站发送复位命令,从动站回答确认。 |
S3 | 请求∕响应 | 启动站请求从动站的响应,从动站作确认、否认或数据响应。 |
S1 S2 S3
seq & 0x0F
2.5.3 数据单元与数据标识
信息点DA | DA1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
DA2 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
信息类DT | DT1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
DT2 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
2.5.3.1 DA
信息点DA:信息点DA由信息点元DA1和信息点组DA2两个字节构成。DA2采用二进制编码方式表示信息点组,低位在前高位在后,DA1对位表示某一信息点组的1~8个信息点,以此共同构成信息点标识pn(n=1~2040),当DA1和DA2全为“0”时,表示终端信息点,用p0表示;运算规则为(DA2-1)*8+DA1对应位的值就是信息点标识pn
信息点组DA2 | 信息点元DA1 | |||||||
---|---|---|---|---|---|---|---|---|
D7~D0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | p8 | p7 | p6 | p5 | p4 | p3 | p2 | p1 |
2 | p16 | p15 | p14 | p13 | p12 | p11 | p10 | p9 |
3 | p24 | p23 | p22 | p21 | p20 | p19 | p18 | p17 |
…… | …… | …… | …… | …… | …… | …… | …… | …… |
255 | P2040 | P2039 | P2038 | P2037 | P2036 | P2035 | P2034 | P2033 |
信息点组DA1 | 对应值 |
---|---|
0x80 | 8 |
0x40 | 7 |
0x20 | 6 |
0x10 | 5 |
0x08 | 4 |
0x04 | 3 |
0x02 | 2 |
0x01 | 1 |
- 当DA1和DA2全为“0”时,表示终端信息点,用p0表示;当DA1=FFH、DA2=00H时,表示所有有效测量点(不含p0)。
- 信息点标识pn对应于不同信息类标识Fn可以是测量点号、总加组号、控制轮次、直流模拟量端口号、任务号。
我的理解是对应的电表地址的索引:1~2033 案例:01 02 DA1: 0000 0001 DA2:2 =p9
2.5.3.2 DT
信息类DT由信息类元DT1和信息类组DT2两个字节构成。DT2采用二进制编码方式表示信息类组,DT1对位表示某一信息类组的1~8种信息类型,以此共同构成信息类标识Fn(n=1~248),运算规则为DT2*8+DT1对应位的值(8421码)就是信息类标识Fn
信息类组DT2 | 信息类元DT1 | |||||||
---|---|---|---|---|---|---|---|---|
D7~D0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | F8 | F7 | F6 | F5 | F4 | F3 | F2 | F1 |
1 | F16 | F15 | F14 | F13 | F12 | F11 | F10 | F9 |
2 | F24 | F23 | F22 | F21 | F20 | F19 | F18 | F17 |
…… | …… | …… | …… | …… | …… | …… | …… | …… |
30 | F248 | F247 | F246 | F245 | F244 | F243 | F242 | F241 |
…… | 未定义 |
案例:04 00 =F3 心跳帧
2.5.4 附加信息域 (AUX)
- 附加信息域可由消息认证码字段PW、事件计数器EC和时间标签Tp组成。
- 消息认证码字段用于重要的下行报文中。
- 事件计数器用于具有重要事件告警状态需上报的上行报文中。
- 时间标签用于允许同时建立多个通信服务的链路传输和信道延时特性较差的传输中。
2.5.4.1 PW
消息认证码字段PW用于重要下行报文,由16字节组成,PW是由主站按系统约定的认证算法产生,并在主站发送的报文中下发给终端,由终端进行校验认证,通过则响应主站命令,反之则否认。终端在收到带有PW的报文,必须在认证通过后,才能响应命令。
2.5.4.2 EC
事件计数器EC用于ACD位置“1”的上行响应报文中,EC由2字节组成,分别为重要事件计数器EC1和一般事件计数器EC2。计数范围0~255,循环加1递增。每发生1个事件,相应的计数器自动加1。
事件计数器EC | 数据格式 | 字节数 |
---|---|---|
重要事件计数器EC1 | BIN | 1 |
一般事件计数器EC2 | BIN | 1 |
2.5.4.3 TP
- 时间标签用于交换网络通道中,对采用同时建立多个通信服务的传输服务,进行辅助判决接收报文的时序和时效性。时间标签Tp由6字节组成
- 时间标签Tp由启动站产生,并通过报文传送给从动站,从动站据此判决收到的报文的时序和时效性,如判别有效,从动站发送响应帧,并在响应帧中将时间标签Tp返回启动站。 | 数据名称 | 数据格式 | 单位 | 字节数 | | --- | --- | --- | --- | | 启动帧帧序号计数器PFC | BIN | | 1 | | 启动帧发送时标 | 见附录A.16 | 秒分时日 | 4 | | 允许发送传输延时时间 | BIN | min | 1 |